package com.gitee.cui.netty.decoder;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ReplayingDecoder;

import java.util.List;

/**
 * 求整型数相加和的解码器，需要分阶段解码并相加求和
 * @author cuiqingqiang
 * @version 1.0
 * @date 2021/10/22 20:21
 **/
public class IntegerAddDecoder extends ReplayingDecoder<IntegerAddDecoder.PHASE> {

    public IntegerAddDecoder() {
        // 在构造函数中初始化第一阶段，表示解析第一个加数
        super(PHASE.PHASE_1);
    }

    /**
     * 第一个加数
     */
    private int first;

    /**
     * 第二个加数
     */
    private int second;

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        switch (state()) {
            case PHASE_1:
                // 解析第一个加数的值
                first = in.readInt();
                // 设置接下来解析第二个加数阶段
                checkpoint(PHASE.PHASE_2);
                break;
            case PHASE_2:
                // 解析第二个加数的值
                second = in.readInt();
                int sum = first + second;
                out.add(sum);
                // 再设置可以解析第一个加数
                checkpoint(PHASE.PHASE_1);
                break;
            default:
                break;
        }
    }

    enum PHASE {
        /**
         * 阶段1，解析第一个加数的值
         */
        PHASE_1,

        /**
         * 阶段2，解析第二个加数的值并求和
         */
        PHASE_2;
    }
}
